#include "serialworker.h"
#include <QDebug>

SerialWorker::SerialWorker(QObject *parent)
    : QObject(parent), mSerialPort(new QSerialPort(this)) {
    connect(mSerialPort, &QSerialPort::readyRead, this,
            &SerialWorker::readData);
    connect(&mMsgParser, SIGNAL(newData(QStringList)), this,
            SLOT(onNewData(QStringList)));
    // mIn.setDevice(mSerialPort);
}

SerialWorker::~SerialWorker() {
    closeSerialPort();
    delete mSerialPort;
}

bool SerialWorker::openSerialPort(const QString &portName, qint32 baudRate) {
    mSerialPort->setPortName(portName);
    mSerialPort->setBaudRate(baudRate);
    return mSerialPort->open(QIODevice::ReadWrite);
}

void SerialWorker::closeSerialPort() {
    if (mSerialPort->isOpen()) {
        mSerialPort->close();
    }
}

// 从串口收到数据触发。组装数据发出信号
void SerialWorker::readData() {
    if (!mSerialPort->bytesAvailable()) {
        return;
    }

    QByteArray data = mSerialPort->readAll();
    if (data.isEmpty()) {
        return;
    }

    // data.data()返回以'\0'结尾的char*
    mMsgParser.unpack(data.data());
}

// void SerialWorker::readData() {
//     while (mSerialPort->bytesAvailable()) {
//         // QDataStream默认是大端
//         mIn.startTransaction();

//         QVector<quint16> data;
//         quint16 tmp;
//         for (int i(0); i < 16; ++i) {
//             mIn >> tmp;
//             data.append(tmp);
//         }

//         if (!mIn.commitTransaction()) {
//             return;
//         }

//         emit newData(data);
//     }

    // 如果你选择使用队列，可以这样做：
    // {
    //     QMutexLocker locker(&queueMutex);
    //     dataQueue.enqueue(data);
    //     // 可以在这里发送一个信号来通知UI线程有数据可读
    // }
// }

void SerialWorker::write(const char *str) { mSerialPort->write(str); }

void SerialWorker::onNewData(QStringList data) {
    emit newData(data);
}
